//C16.15:functor.cpp -- using a functor
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>

template<class T>    // functor clas defines operator(){}
class TooBig
{
    T cutoff;
    public:
        TooBig(const T & t) : cutoff(t){}
        bool operator()(const T & v){ return v > cutoff; }
};

void outint(int n){ std::cout << n << " "; }
int main(void)
{
    using std::cout;
    using std::list;
    using std::endl;

    TooBig<int> f100(100);   // limit = 100
    int vals[10] = {50, 100 ,90, 180, 60, 210, 415, 88, 188, 201};                             
    list<int> yadayada(vals, vals + 10);    // range constructor
    list<int> etcetera(vals, vals + 10);                                            
    // C++11 can use the following instead
    // list<int> yadayada = {50, 100, 90, 180, 60, 210, 415, 88, 188, 210};
    // list<int> etcetera {50, 100, 90, 180, 60, 210, 210, 415, 88, 188 201}
    cout << "Original lists:\n";
    for_each(yadayada.begin(),yadayada.end(), outint);
    cout << endl;
    for_each(etcetera.begin(), etcetera.end(), outint);
    cout << endl;
    yadayada.remove_if(f100);                // use a named functor
    etcetera.remove_if(TooBig<int>(200));    // construct a function object
    cout << "Trimmed lists:\n";                                             
    for_each(yadayada.begin(), yadayada.end(), outint);
    cout << endl;
    for_each(etcetera.begin(), etcetera.end(), outint);
    cout << endl;
}
